/**
 * 最简单的代理是空代理，即除了作为一个抽象的目标对象，什么也不做。默认情况下，在代理对象上执行的所有操作都会无障碍地传播到目标对象。因此，在任何可以使用目标对象的地方，都可以通过同样的方式来使用与之关联的代理对象。
 */
;(function () {
    const target = {
        id: 'target'
    };
    const handler = {};
    const proxy = new Proxy(target, handler);
// id 属性会访问同一个值
    console.log(target.id); // target
    console.log(proxy.id); // target
// 给目标属性赋值会反映在两个对象上
// 因为两个对象访问的是同一个值
    target.id = 'foo';
    console.log(target.id); // foo
    console.log(proxy.id); // foo
// 给代理属性赋值会反映在两个对象上
// 因为这个赋值会转移到目标对象
    proxy.id = 'bar';
    console.log(target.id); // bar
    console.log(proxy.id); // bar
// hasOwnProperty()方法在两个地方
// 都会应用到目标对象
    console.log(target.hasOwnProperty('id')); // true
    console.log(proxy.hasOwnProperty('id')); // true
// Proxy.prototype 是 undefined
// 因此不能使用 instanceof 操作符
//     console.log(target instanceof Proxy); // TypeError: Function has non-object prototype 'undefined' in instanceof check
//     console.log(proxy instanceof Proxy); // TypeError: Function has non-object prototype 'undefined' in instanceof check
// 严格相等可以用来区分代理和目标
    console.log(target === proxy); // false
})()